// GTY


#include "UI/HUD/AuraHUD.h"
#include "UI/Widget/AuraUserWidget.h"
#include "UI/WidgetController/OverlayWidgetController.h"
#include "Blueprint/UserWidget.h"
#include "UI/WidgetController/AttributeMenuWidgetController.h"
#include "UI/WidgetController/SpellMenuWidgetController.h"

UOverlayWidgetController* AAuraHUD::GetOverlayWidgetController(const FWidgetControllerParams& WCParams)
{
	if(OverlayWidgetController == nullptr)
	{
		OverlayWidgetController = NewObject<UOverlayWidgetController>(this, OverlayWidgetControllerClass);
		/*
		*   使用NewObject函数创建一个新的UOverlayWidgetController对象。
		*	NewObject 函数的第一个参数是当前对象的指针this，表示新创建的对象将作为当前对象的一个子对象。
		*	第二个参数OverlayWidgetControllerClass是UOverlayWidgetController类的类指针，用于指定要创建的对象的具体类型。
		 */
		
		OverlayWidgetController->UAuraWidgetController::SetWidgetControllerParams(WCParams);//设置参数
		OverlayWidgetController->BindCallbacksToDependencies();//绑定回调
		return OverlayWidgetController;
	}
	return OverlayWidgetController;
}

UAttributeMenuWidgetController* AAuraHUD::GetAttributeMenuWidgetController(const FWidgetControllerParams& WCParams)
{
	if(AttributeMenuWidgetController == nullptr)
	{
		AttributeMenuWidgetController = NewObject<UAttributeMenuWidgetController>(this, AttributeMenuWidgetControllerClass);
		AttributeMenuWidgetController->UAuraWidgetController::SetWidgetControllerParams(WCParams);
		AttributeMenuWidgetController->BindCallbacksToDependencies();
		return AttributeMenuWidgetController;
	}
	return AttributeMenuWidgetController;
}

USpellMenuWidgetController* AAuraHUD::GetSpellMenuWidgetController(const FWidgetControllerParams& WCParams)
{
	if(SpellMenuWidgetController == nullptr)
	{
		SpellMenuWidgetController = NewObject<USpellMenuWidgetController>(this, SpellMenuWidgetControllerClass);
		SpellMenuWidgetController->SetWidgetControllerParams(WCParams);
		SpellMenuWidgetController->BindCallbacksToDependencies(); //绑定监听数值变化
	}
	return SpellMenuWidgetController;

}

void AAuraHUD::InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS)
{

	checkf(OverlayWidgetClass, TEXT("OverlayWidgetClass 未设置，请在BP_AuraHUD上面设置")); //会打印相关信息到log列表
	checkf(OverlayWidgetControllerClass, TEXT("OverlayWidgetControllerClass 未设置，请在BP_AuraHUD上面设置"));

	UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(), OverlayWidgetClass);//创建用户界面
	OverlayWidget = Cast<UAuraUserWidget>(Widget);//强制转换为AuraUserWidget
	
	const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);//创建参数
	UOverlayWidgetController *WidgetController = GetOverlayWidgetController(WidgetControllerParams);//获取OverlayWidgetController

	OverlayWidget->UAuraUserWidget::SetWidgetController(WidgetController);

	WidgetController->BroadcastInitialValues();//发送初始值
	Widget->AddToViewport();// 添加到视区
}

